/************************************************************************
 * <br>
 * <ul>
 * <li>版权所有：唐山弘川科技有限公司 2009－2020</li>
 * <li>创建日期：2009-8-10</li>
 * <li>初始作者：刘川</li>
 * </ul>
 * <ul>
 * <b>修订历史</b>
 * <li>1、</li>
 * </ul>
 ***********************************************************************/
package com.hy.enterprise.framework.persistence.domain.query ;

import java.util.Date;

import com.hy.enterprise.framework.persistence.domain.query.conditions.ConditionalExpression;

/**
 * <ul>
 * <li>设计作者：刘川</li>
 * <li>设计日期：2009-8-10</li>
 * <li>设计时间：下午03:50:40</li>
 * <li>设计目的：</li>
 * </ul>
 * <ul>
 * <b>修订历史</b>
 * <li>1、</li>
 * </ul>
 */
public class HavingClause < S > extends AbstractClause implements
        ISubQuery < S >
{
	private final ConditionalExpression	conditionalExpression ;

	/**
	 * 构造函数
	 * 
	 * @param previousClause
	 * @param conditionalExpression
	 */
	HavingClause (
	               GroupByClause < S > previousClause ,
	               ConditionalExpression conditionalExpression )
	{
		super (
		        previousClause ) ;
		this.conditionalExpression =
		                             conditionalExpression ;
	}

	/**
	 * @see com.hy.enterprise.framework.persistence.domain.query.AbstractClause#addTo(java.lang.StringBuilder)
	 */
	@ Override
	StringBuilder addTo (
	                      StringBuilder stringBuilder )
	{
		stringBuilder
		             .append (
		                       " HAVING " )
		             .append (
		                       this.conditionalExpression
		                                                 .getPreferredStringRepresentation ( ) ) ;
		return stringBuilder ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:51:31</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param character
	 * @return
	 */
	public OrderByClause orderBy (
	                               Character character )
	{
		return this
		           .orderBy (
		                      character ,
		                      SortDirection.ASC ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:50:56</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param character
	 * @param sortDirection
	 * @return
	 */
	public OrderByClause orderBy (
	                               Character character ,
	                               SortDirection sortDirection )
	{
		return new OrderByClause (
		                           this ,
		                           character ,
		                           sortDirection ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:52:48</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param date
	 * @return
	 */
	public OrderByClause orderBy (
	                               Date date )
	{
		return this
		           .orderBy (
		                      date ,
		                      SortDirection.ASC ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:52:20</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param date
	 * @param sortDirection
	 * @return
	 */
	public OrderByClause orderBy (
	                               Date date ,
	                               SortDirection sortDirection )
	{
		return new OrderByClause (
		                           this ,
		                           date ,
		                           sortDirection ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:53:06</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param number
	 * @return
	 */
	public OrderByClause orderBy (
	                               Number number )
	{
		return this
		           .orderBy (
		                      number ,
		                      SortDirection.ASC ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:52:44</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param number
	 * @param sortDirection
	 * @return
	 */
	public OrderByClause orderBy (
	                               Number number ,
	                               SortDirection sortDirection )
	{
		return new OrderByClause (
		                           this ,
		                           number ,
		                           sortDirection ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:51:58</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param string
	 * @return
	 */
	public OrderByClause orderBy (
	                               String string )
	{
		return this
		           .orderBy (
		                      string ,
		                      SortDirection.ASC ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:51:48</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param string
	 * @param sortDirection
	 * @return
	 */
	public OrderByClause orderBy (
	                               String string ,
	                               SortDirection sortDirection )
	{
		return new OrderByClause (
		                           this ,
		                           string ,
		                           sortDirection ) ;
	}
}
